package com.lanou.cart.service.impl;


import com.lanou.cart.mapper.CartMapper;
import com.lanou.cart.service.CartService;
import com.lanou.entity.entity.CartItem;
import com.lanou.entity.entity.ItemEntity;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 创建人   :卢松
 * 创建时间 :2019-07-11
 **/
@Service
public class CartServiceImpl implements CartService {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Resource
    private CartMapper cartMapper;

//    点 +  存储 cart 并设置 key 过期时间
    @Override
    public void add(CartItem cart, String key) {

        ValueOperations<String, Object> ops = this.redisTemplate.opsForValue();
        if (key != null && !key.equals("")) {
            if (ops.get(key) != null) {
                List<CartItem> list = (List) ops.get(key);
                if (list != null && list.contains(cart)) {
                    for (CartItem cartItem : list) {
                        if (cartItem.getEntity().getId().equals(cart.getEntity().getId())) {
                            cartItem.setCount(cartItem.getCount() + cart.getCount());
                        }
                        return;
                    }
                } else {
                    list.add(cart);
                }
                ops.set(key, list,7, TimeUnit.DAYS);
            } else {
                List<CartItem> list = new ArrayList<>();
                list.add(cart);
                ops.set(key, list,7, TimeUnit.DAYS);
            }
        }else {
            System.out.println("请先去登录");
        }
    }

//    查商品详情
    @Override
    public ItemEntity findItem(Long itemId) {

        ItemEntity item = this.cartMapper.findItemById(itemId);

        return item;
    }

    /**
     * 点击 delete 根据 商品id 删除 商品
     * @param id
     */
    @Override
    public boolean dele(String userId, Long id) {

        List<CartItem> cartItemList =(List<CartItem>) this.redisTemplate.opsForValue().get(userId);
       boolean b = false;
        Iterator<CartItem> cartItemIterator = cartItemList.iterator();

        while (cartItemIterator.hasNext()){

            CartItem cartItem = cartItemIterator.next();

            if(cartItem.getEntity().getId().equals(id)){
               cartItemIterator.remove();
               b = true;
            }
        }
        this.redisTemplate.opsForValue().set(userId,cartItemList);

        return b;
    }

    @Override
    public void update(String userId, Long id, Long num, String s) {

        if (userId != null && !userId.equals("")){
            List<CartItem> cartItemList =(List<CartItem>) this.redisTemplate.opsForValue().get(userId);
            for (CartItem cartItem : cartItemList) {
                if (cartItem.getEntity().getId().equals(id)){

                    cartItem.setIsExists(s);
                    cartItem.setCount(Integer.valueOf(String.valueOf(num)));

                }else {
                    System.out.println("未找到该商品");
                }
            }
            this.redisTemplate.opsForValue().set(userId,cartItemList);
        }else {
            System.out.println("请先登录");
        }

    }

    @Override
    public void deleList(String userId, String arr[]) {

        List<CartItem> list = null;
        if (userId != null && !userId.equals("")){
            List<CartItem> cartItemList = (List<CartItem>) this.redisTemplate.opsForValue().get(userId);

            for (CartItem cartItem : cartItemList) {

                    for (int i = 0; i <arr.length ; i++) {

                        if (cartItem.getEntity().getId().equals(arr[i])){
                            list.add(cartItem);
                        }
                    }
                }
            cartItemList.removeAll(list);
        this.redisTemplate.opsForValue().set(userId,cartItemList);
        }
    }

    /**
     * 通过key查找并返回 购物车list
     * list里面放的是 商品详情 购买数量 库存缺货情况
     *
     * @param key
     * @return List<CartItem>
     */
    @Override
    public List<CartItem> find(String key) {

        ValueOperations<String, Object> ops = this.redisTemplate.opsForValue();

        return (List<CartItem>)ops.get(key);
    }
}
